iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Software Development

C#世界初探險系列 第 18

2022鐵人賽 Day 18 物件導向程式設計特性

  • 分享至 

  • xImage
  •  

阿搂哈~大家好
今天要來講物件物件導向程式設計的特性拉~
在開始使用物件導向觀念來設計之前,除了要先了解物件和彼此間的關係,也必須了解有那些特性,才能寫出符合需求的物件導向程式。
物件導向程式設計特性包含:

  1. 抽象化(Abstraction)
    顧名思義,若以它的動詞Abstract(萃取)來思考或許會更加清楚。人們在思考物件時,往往是以抽象化來處理複雜的事物,而不是鑽牛角尖朝物件的實體來思考。
    一般的高階語言都將變數抽象化,利用資料抽象化可以資料隱藏,抽象化只注重物件和外界溝通的行為,而與資料內部執行細節沒有關係。如:單價以price當作變數名稱,而不以A、B這種無意義的方式來進行資料處理。在物件導向程式中,更將抽象化擴展到物件上,程式設計者可以直覺方式針對Car(汽車)物件,以Car.weight代表汽車的重量、Car.Start()啟動汽車方法,而不用GetWeight(Car)函式來取得汽車重量、用Start(Car)來啟動汽車。

  2. 封裝(Encapsulation)
    每個人都有隱私,若喪失隱私,就讓別人一覽無遺,毫無秘密可言,資料封裝就有如人類的隱私。物件也是一樣,或多或少都有屬於物件內部的私有部分(屬性、方法等),而這些部分必須是外界無法直接存取的。如此才能保留物件的完整性。因此物件必須將私有的部分封裝在物件內部,而使用者只能藉由物件所提供的方法、屬性來操控物件,以保持物件的完整性,這就是封裝的特性。
    至於物件導向程式語言,將資料結構和用來操作該資料結構的所有方法都封裝在物件的類別定義中。外界無法直接存取該物件內部的資料結構,僅能夠過物件開放的存取介面來進行存取,因此可以保護物件的完整性。
    物件是活的,資料成員的內容會隨著狀態與時間的不同而改變;至於資料是死的,除非有人去更動它,否則都不會改變。所以類別主要任務就是把資料和相關的函式封裝起來,告訴電腦此物件含有哪些資料成員與成員函式,外界欲存取物件內的屬性,必須透過成員函式而達到資料封裝(Encapsulation)的特性。所以程式就是透過類別來完成某個特定程式設計的工作。

  3. 繼承(Inheritance)
    在真實世界中,有許多物件的特徵和行為很相似,而這些性質相似的物件往往都是經由繼承而來。如:兒子長得像父親,主要是因為兒子遺傳了父親的諸多特性,但是兒子會因為外在因素而產生一些新的特性,這是父親所沒有的,像是兒子會電腦而父親不會等等。所以一個物件A得到另一個物件B特性的過程稱為A繼承(Inheritance)B,物件B則屬於父類別(Super class)或稱基礎類別(Base Class),物件A則屬於子類別(Subclass)或衍生類別(Derived Class)。
    父類別中的資料或方法在子類別中的物件就可繼承使用,子類別往下延伸的次子類別物件也可繼承使用。由於物件具有繼承的特性,使得物件導向程式設計具可再用(Reused)和擴充性。

  4. 多形(Polymorphism)
    多型又稱同名異式。所謂多形就是物件可使用相同功能(方法)介面,來操作不同類型的物件,而產生不同行為的一種機制,簡而言之就是一個介面,多個方法。方法雖相同,但會因不同的物件而產生不同的結過。物件有了多形的特性,就可以簡化很多物件處理的過程。也就是說物件允許它的方法名稱相同,卻依參數個術或參數資料型別的不同而產生多個方法。程式執行時會選擇合適的方法來執行。

  5. 動態繫結(Dynamic binding)
    一般在呼叫物件方法,有兩種與物件的繫結方式,一種是靜態繫結(Static binding),另一種是動態繫結(Dynamic binding)

    1. 靜態繫結
      同一類別的物件,在程式執行時必須能夠清楚辨別到底是存取哪個物件的屬性或執行哪個物件方法,否則程式執行時無法分辨出是哪個物件的屬性或方法。
    2. 動態繫結
      動態連結是指編譯器在進行編譯程式的階段時不將物件與方法繫結在一起,而是將物件方法的位址建立成一個虛擬表格(Virtual table),在程式執行階段時,再由虛擬表格去判斷該呼叫哪個物件方法。

今天就先講解到這裡拉~
大家掰掰~
明天見owo


上一篇
2022鐵人賽 Day 17 物件/類別介紹
下一篇
2022鐵人賽 Day 19 建立類別/命名空間
系列文
C#世界初探險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言